/**
 * @file ethercat_interface.h
 * @brief EtherCAT主站抽象接口定义
 * 
 * 该文件定义了EtherCAT主站的抽象接口，用于同时兼容IgH和SOEM两种主站实现
 */

#ifndef ETHERCAT_INTERFACE_H
#define ETHERCAT_INTERFACE_H

#include <stdint.h>
#include <stdbool.h>

/**
 * @brief EtherCAT主站类型枚举
 */
typedef enum {
    MASTER_TYPE_IGH,   /**< IgH EtherCAT主站 */
    MASTER_TYPE_SOEM    /**< SOEM EtherCAT主站 */
} EtherCATMasterType;

/**
 * @brief EtherCAT从站状态枚举
 */
typedef enum {
    EC_STATE_NONE,      /**< 无状态 */
    EC_STATE_INIT,       /**< 初始化状态 */
    EC_STATE_PREOP,      /**< 预操作状态 */
    EC_STATE_SAFEOP,     /**< 安全操作状态 */
    EC_STATE_OPERATIONAL /**< 操作状态 */
} EtherCATState;

/**
 * @brief EtherCAT主站接口结构体
 */
typedef struct {
    /**
     * @brief 初始化EtherCAT主站
     * 
     * @param ifname 网络接口名称
     * @return 成功返回true，失败返回false
     */
    bool (*init)(const char *ifname);
    
    /**
     * @brief 配置并自动发现从站
     * 
     * @return 发现的从站数量
     */
    int (*config_init)(void);
    
    /**
     * @brief 配置过程数据对象映射
     * 
     * @param io_map IO映射缓冲区
     * @return 成功返回true，失败返回false
     */
    bool (*config_map)(void *io_map);
    
    /**
     * @brief 配置分布式时钟
     * 
     * @return 成功返回true，失败返回false
     */
    bool (*config_dc)(void);
    
    /**
     * @brief 检查从站状态
     * 
     * @param slave 从站索引，0表示所有从站
     * @param state 期望的状态
     * @param timeout 超时时间(微秒)
     * @return 成功返回true，失败返回false
     */
    bool (*state_check)(uint16_t slave, EtherCATState state, int timeout);
    
    /**
     * @brief 设置从站状态
     * 
     * @param slave 从站索引，0表示所有从站
     * @param state 目标状态
     * @return 成功返回true，失败返回false
     */
    bool (*write_state)(uint16_t slave, EtherCATState state);
    
    /**
     * @brief 发送过程数据
     * 
     * @return 成功返回true，失败返回false
     */
    bool (*send_processdata)(void);
    
    /**
     * @brief 接收过程数据
     * 
     * @param timeout 超时时间(微秒)
     * @return 工作计数器值
     */
    int (*receive_processdata)(int timeout);
    
    /**
     * @brief 读取从站状态
     * 
     * @return 成功返回true，失败返回false
     */
    bool (*read_state)(void);
    
    /**
     * @brief 关闭EtherCAT主站
     */
    void (*close)(void);
    
    /**
     * @brief 获取从站数量
     * 
     * @return 从站数量
     */
    int (*get_slave_count)(void);
    
    /**
     * @brief 获取从站输入数据指针
     * 
     * @param slave 从站索引
     * @return 输入数据指针
     */
    uint8_t* (*get_slave_inputs)(uint16_t slave);
    
    /**
     * @brief 获取从站输出数据指针
     * 
     * @param slave 从站索引
     * @return 输出数据指针
     */
    uint8_t* (*get_slave_outputs)(uint16_t slave);
} EtherCATInterface;

/**
 * @brief 创建EtherCAT主站接口实例
 * 
 * @param type 主站类型
 * @return EtherCAT主站接口指针
 */
EtherCATInterface* create_ethercat_master(EtherCATMasterType type);

/**
 * @brief 销毁EtherCAT主站接口实例
 * 
 * @param interface EtherCAT主站接口指针
 */
void destroy_ethercat_master(EtherCATInterface* interface);

#endif /* ETHERCAT_INTERFACE_H */